package com.eastfair.projectcore.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.eastfair.auth.entity.Organization;
import com.eastfair.boot.service.SuperCacheServiceImpl;
import com.eastfair.cache.projectcore.DataIsolationCacheKeyBuilder;
import com.eastfair.cache.projectcore.ProjectDbCacheKeyBuilder;
import com.eastfair.core.context.ContextUtil;
import com.eastfair.core.model.CacheKeyBuilder;
import com.eastfair.model.DataIsolationVo;
import com.eastfair.projectcore.dao.DataIsolationMapper;
import com.eastfair.projectcore.entity.DataIsolation;
import com.eastfair.projectcore.entity.ProjectDb;
import com.eastfair.projectcore.enumeration.DataIsolationSystemSceneEnum;
import com.eastfair.projectcore.service.DataIsolationService;
import com.eastfair.boot.service.SuperServiceImpl;

import com.eastfair.uid.baidu.rule.SnowFlakeRole;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.eastfair.constant.BusinessConstant;
import com.eastfair.core.base.R;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

//import com.baomidou.dynamic.datasource.annotation.DS;

/**
 * <p>
 * 业务实现类
 * 数据隔离表
 * </p>
 *
 * @author ligang
 * @date 2022-06-01
 */
@Slf4j
@Service
public class DataIsolationServiceImpl extends SuperCacheServiceImpl<DataIsolationMapper, DataIsolation> implements DataIsolationService {

    @Autowired
    SnowFlakeRole snowFlakeRole;
    /**
     * 处理逻辑删除相关处理
     *
     * @param modelList 实体
     * @return 是否成功
     */
    @Override
    protected R<Boolean> handlerRemoveByIdsOfLogic(Collection<DataIsolation> modelList) {
        modelList.stream().forEach(s -> {
            s.setIsDeleted(BusinessConstant.YES);
        });
        // TODO: 2021/10/29 这里需要操作其他业务，如清空角色等
        return R.successDef();
    }
    /**
     * 处理新增相关处理
     *
     * @param model 实体
     * @return 是否成功
     */
    @Override
    protected R<Boolean> handlerSave(DataIsolation model) {
        model.setId(snowFlakeRole.findUidSimple());
        return R.successDef();
    }

    @Override
    public List<DataIsolationVo> createSystem(Long projectId) {
        List<DataIsolationVo> dataIsolationVoList = new ArrayList<>();
        List<DataIsolation> dataIsolationList = new ArrayList<>();
        for (DataIsolationSystemSceneEnum dataIsolationSystemSceneEnum : DataIsolationSystemSceneEnum.values()) {
            DataIsolation dataIsolation = new DataIsolation();
            dataIsolation.setProjectId(projectId);
            dataIsolation.setSystemScene(dataIsolationSystemSceneEnum);
            QueryWrapper<DataIsolation> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().eq(DataIsolation::getIsDeleted, BusinessConstant.NO);
            queryWrapper.lambda().eq(DataIsolation::getSystemScene, dataIsolationSystemSceneEnum);
            queryWrapper.lambda().eq(DataIsolation::getProjectId, projectId);
            DataIsolation dataIsolation1 =  getOne(queryWrapper);
            if(dataIsolation1==null){
                save(dataIsolation);
                dataIsolationList.add(dataIsolation);
            }else{
                dataIsolationList.add(dataIsolation1);
            }
        }
        for(DataIsolation dataIsolation : dataIsolationList){
            DataIsolationVo dataIsolationVo = new DataIsolationVo();
            BeanUtils.copyProperties(dataIsolation,dataIsolationVo);
            dataIsolationVo.setSystemScene(dataIsolation.getSystemScene().getCode());
            dataIsolationVo.setId(dataIsolation.getId());
            dataIsolationVoList.add(dataIsolationVo);
        }
        return dataIsolationVoList;
    }

    @Override
    public CacheKeyBuilder getCacheKeyBuilder() {
        return  new DataIsolationCacheKeyBuilder();
    }
}
